#[cfg(test)]
mod tests {
    // 此函数取得堆分配的内存的所有权
    fn destroy_box(c: Box<i32>) {
        println!("Destroying a box that contains {}", c);

        // `c` 被销毁且内存得到释放
    }

    #[test]
    fn test() {
        // 栈分配的整型
        let x = 5u32;

        // 将 `x` *复制*到 `y`——不存在资源移动
        let y = x;

        // 两个值各自都可以使用
        println!("x is {}, and y is {}", x, y);

        // `a` 是一个指向堆分配的整数的指针
        let a = Box::new(5i32);

        println!("a contains: {}", a);

        // *移动* `a` 到 `b`
        let b = a;
        // 把 `a` 的指针地址（而非数据）复制到 `b`。现在两者都指向
        // 同一个堆分配的数据，但是现在是 `b` 拥有它。

        // 报错！`a` 不能访问数据，因为它不再拥有那部分堆上的内存。
        //println!("a contains: {}", a);
        // 试一试 ^ 去掉此行注释

        // 此函数从 `b` 中取得堆分配的内存的所有权
        destroy_box(b);

        // 此时堆内存已经被释放，这个操作会导致解引用已释放的内存，而这是编译器禁止的。
        // 报错！和前面出错的原因一样。
        //println!("b contains: {}", b);
        // 试一试 ^ 去掉此行注释
    }
}
